package com.sdtv.mediunfusion.base.config;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Process;
import android.text.TextUtils;

import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;
import com.blankj.utilcode.util.ScreenUtils;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.SDKOptions;
import com.netease.nimlib.sdk.StatusBarNotificationConfig;
import com.netease.nimlib.sdk.auth.LoginInfo;
import com.netease.nimlib.sdk.mixpush.MixPushConfig;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.uinfo.UserInfoProvider;
import com.netease.nimlib.sdk.uinfo.model.UserInfo;
import com.netease.nimlib.sdk.util.NIMUtil;
import com.sdtv.basemodule.base.BaseApplication;
import com.sdtv.mediunfusion.R;
import com.sdtv.mediunfusion.bean.UserIdentify;
import com.sdtv.mediunfusion.mvp.ui.meltcall.MeltCallListActivity;

import java.io.IOException;

/**
 * @ProjectName: MediunFusion
 * @Package: com.sdtv.mediunfusion.base
 * @ClassName: MediumApplication
 * @Description: --应用application --初始化操作可以在这里面设置
 * @Author: 小郭同学
 * @CreateDate: 2019-07-02 14:18
 * @UpdateRemark: 更新说明
 * @Version: 1.0
 */
public class MediumApplication extends BaseApplication {

    /**
     * 全局的用户对象
     */
    private static volatile UserIdentify userIdentify;

    public static UserIdentify getUserIdentify() {
        if (null == userIdentify) {
            synchronized (BaseApplication.class) {
                if (null == userIdentify) {
                    userIdentify = new UserIdentify();
                }
            }
        }
        return userIdentify;
    }

    public void setUserIdentify(UserIdentify userIdentify) {
        this.userIdentify = userIdentify;
    }


    /**
     * 设置config文件
     * <p>
     * 主要是网络请求的一些配置等
     */
    @Override
    protected void initConfigure() {
        config = new MediumConfig(this);
    }

    @Override
    protected void init() {
        // 初始化第三方
        new Thread(() -> {
            //设置线程优先级 不与主线程抢占资源
            Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
            //在使用SDK各组件之前初始化context信息，传入ApplicationContext
            SDKInitializer.initialize(getContext());
            //自4.3.0起，百度地图SDK所有接口均支持百度坐标和国测局坐标，用此方法设置您使用的坐标类型.
            //包括BD09LL和GCJ02两种坐标，默认是BD09LL坐标。
            SDKInitializer.setCoordType(CoordType.BD09LL);
            //网易云信初始化操作
        }).start();
        // 在主进程中初始化云信操作
        initNIMClient();
    }

    /**
     * 初始化网易云信 视频通话
     */
    private void initNIMClient() {
        NIMClient.init(this, getLoginInfo(), options());
        // ... your codes
        if (NIMUtil.isMainProcess(this)) {
            // 注意：以下操作必须在主进程中进行
            // 1、UI相关初始化操作
            // 初始化UIKit模块
//            NimUIKit.init(this);
        }
    }


    // 如果已经存在用户登录信息，返回LoginInfo，否则返回null即可
    private LoginInfo getLoginInfo() {

        return null;
    }


    // 如果返回值为 null，则全部使用默认参数。
    private SDKOptions options() {
        SDKOptions options = new SDKOptions();

        // 如果将新消息通知提醒托管给 SDK 完成，需要添加以下配置。否则无需设置。
        StatusBarNotificationConfig config = new StatusBarNotificationConfig();
        config.notificationEntrance = MeltCallListActivity.class; // 点击通知栏跳转到该Activity
        config.notificationSmallIconId = R.mipmap.ic_launcher;
        // 呼吸灯配置
        config.ledARGB = Color.GREEN;
        config.ledOnMs = 1000;
        config.ledOffMs = 1500;
        // 通知铃声的uri字符串
        config.notificationSound = "android.resource://com.qingk.mmsmobilebg/raw/msg.wav";
        options.statusBarNotificationConfig = config;

        // 配置保存图片，文件，log 等数据的目录
        // 如果 options 中没有设置这个值，SDK 会使用采用默认路径作为 SDK 的数据目录。
        // 该目录目前包含 log, file, image, audio, video, thumb 这6个目录。
        String sdkPath = getAppCacheDir(this) + "/nim"; // 可以不设置，那么将采用默认路径
        // 如果第三方 APP 需要缓存清理功能， 清理这个目录下面个子目录的内容即可。
        options.sdkStorageRootPath = sdkPath;

        // 配置是否需要预下载附件缩略图，默认为 true
        options.preloadAttach = true;

        // 配置附件缩略图的尺寸大小。表示向服务器请求缩略图文件的大小
        // 该值一般应根据屏幕尺寸来确定， 默认值为 Screen.width / 2
        options.thumbnailSize = ScreenUtils.getAppScreenWidth() / 2;

        // 第三方推送配置
        MixPushConfig pushConfig = new MixPushConfig();
        // 华为推送
        pushConfig.hwCertificateName = "huaweizhengshu";

        // 用户资料提供者, 目前主要用于提供用户资料，用于新消息通知栏中显示消息来源的头像和昵称
        options.userInfoProvider = new UserInfoProvider() {
            @Override
            public UserInfo getUserInfo(String account) {
                return null;
            }


            @Override
            public String getDisplayNameForMessageNotifier(String account, String sessionId,
                                                           SessionTypeEnum sessionType) {
                return null;
            }

            @Override
            public Bitmap getAvatarForMessageNotifier(SessionTypeEnum sessionTypeEnum, String s) {
                return null;
            }
        };
        return options;
    }

    /**
     * 配置 APP 保存图片/语音/文件/log等数据的目录
     * 这里示例用SD卡的应用扩展存储目录
     */
    static String getAppCacheDir(Context context) {
        String storageRootPath = null;
        try {
            // SD卡应用扩展存储区(APP卸载后，该目录下被清除，用户也可以在设置界面中手动清除)，请根据APP对数据缓存的重要性及生命周期来决定是否采用此缓存目录.
            // 该存储区在API 19以上不需要写权限，即可配置 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
            if (context.getExternalCacheDir() != null) {
                storageRootPath = context.getExternalCacheDir().getCanonicalPath();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (TextUtils.isEmpty(storageRootPath)) {
            // SD卡应用公共存储区(APP卸载后，该目录不会被清除，下载安装APP后，缓存数据依然可以被加载。SDK默认使用此目录)，该存储区域需要写权限!
            //storageRootPath = Environment.getExternalStorageDirectory() + "/" + DemoCache.getContext().getPackageName();
        }

        return storageRootPath;
    }


}
